package Ep01_String.Offer_20;

/**
 * @author Jimmy Zhan WORKSTATION
 * @since 2023/7/12 9:56
 * 说明：判断一个字符串是否是一个数值
 *
 */

public class Mark {
    public boolean isNumber(String s) {
        // 排除特殊情况
        if(s.length()==0||s.equals("")) return false;

        // 三个标记符号，分别代表数字、小数点、e/E
        boolean numSeen=false;
        boolean dotSeen=false;
        boolean expSeen=false;

        // 去除两边的空格
        s=s.trim();
        // 遍历字符串
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(c>='0' && c<='9'){
                numSeen=true;   // 出现了数字
            }
            else if(c=='.'){
                // 判断在小数点之前书否出现了小数点或e/(E)，如果出现了则不符合要求直接false
                if(dotSeen||expSeen) return false;
                // 没出现就标记一下小数点
                dotSeen=true;
            }
            else if(c=='e'||c=='E'){
                // 判断在e之前是否出现e或者是否一个数也没有，如果是则不符合要求直接false
                if(expSeen||!numSeen) return false;
                // 如果这是第一个e那就置true
                expSeen=true;
                numSeen=false;  // 并且把num置false，防止最后在return的时候出现12E，0E这种错误情况
            }
            else if(c=='-'||c=='+'){
                // +-不能紧跟在e后面
                if( i > 0 && s.charAt(i-1)!='e' && s.charAt(i-1)!='E') return false;
            }
            else{
                return false;
            }
        }
        return numSeen;
    }
}





